/*  f_grammar.h
    
    Header file for the F_Grammar class.

    Nicholas Green
    Recognizer
*/

#ifndef F_GRAMMAR_H
#define F_GRAMMAR_H

#include "recognizer.h"
#include "environment.h"
#include <stdio.h>
#include <string.h>

class F_Grammar
{
public:
  F_Grammar(FILE* file);
  ~F_Grammar();

  Recognizer* m_recognizer;
  std::string ops[21];
  Environment e;
  
  Lexeme* display();
  bool displayPending();
  Lexeme* displayN();
  bool displayNPending();
  Lexeme* varDef();
  bool varDefPending();
  Lexeme* optParamList();
  bool optParamListPending();
  Lexeme* funcDef();
  bool funcDefPending();
  Lexeme* primary();
  bool primaryPending();
  Lexeme* expression();
  bool expressionPending();  
  Lexeme* varExpression();
  bool varExpressionPending();
  Lexeme* optExpressionList();
  bool optExpressionListPending();  
  Lexeme* foperator();
  bool operatorPending(); 
  Lexeme* ifStatement();
  bool ifStatementPending();  
  Lexeme* block();
  bool blockPending();  
  Lexeme* statementList();
  bool statementListPending();  
  Lexeme* statement();
  bool statementPending();  
  Lexeme* optElse();
  bool optElsePending();
  Lexeme* optInit();
  bool optInitPending();
  Lexeme* optCaseList();
  bool optCaseListPending();
  Lexeme* whileStatement();
  bool whileStatementPending();
  Lexeme* switchStatement();
  bool switchStatementPending();
  Lexeme* optMultCaseList();
  bool optMultCaseListPending();
  void pp(Lexeme* pt);
  void ppList(Lexeme* pt, const char* separator);
  void printFuncDef(Lexeme* pt);
  void printCond(Lexeme* pt);
  void printFuncCall(Lexeme* pt);
  void printVarDef(Lexeme* pt);
  void printWhile(Lexeme* pt);
};

#endif